package com.rocketmq.test.controller;

import com.rocketmq.test.msg.TeduUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class SendController {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    //localhost:8080/send?username=王翠花&age=18
    @GetMapping("/send")
    public String send(TeduUser user){
        //接受到user对象 想要将其封装到消息中发送到rocketmq
        //发送成功返回success 发送失败 返回faild
        //学习了解rocketMQTempalte发送消息的相关api
        //syncSend asyncSend 同步发送消息和异步发送消息
        //1. syncSend 发送普通消息
        //创建准备一个消息对象 填充一个payload消息载荷=消息体
        Message<TeduUser> message = MessageBuilder.withPayload(user).build();
        //调用方法发送 destination 目标 目的地 message 封装好的消息对象
        //destination可以指的是一个主题名称，也可以包含发送消息时的tag
        /*SendResult sendResult = rocketMQTemplate.syncSend("topic-test01", message);
        if (sendResult.getSendStatus().toString().equals("SEND_OK")){
            //说明发送成功
            return "success";
        }
        return "fail";*/
        //2 syncSend 发送延迟消息
        /*SendResult sendResult=rocketMQTemplate.syncSend
                ("topic-test02",message,500,18);
        log.info("当前消息发送完成");
        if (sendResult.getSendStatus().toString().equals("SEND_OK")){
            //说明发送成功
            return "success";
        }
        return "fail";*/
        //3 asyncSend 参数和syncSend几乎完全一样 只多了一个回调函数
        rocketMQTemplate.asyncSend("topic-test01", message, new SendCallback() {
            //异步线程会根据rocketmq的反馈结果 执行以下2个方法
            //发送成功执行onSuccess
            @Override
            public void onSuccess(SendResult sendResult) {
                log.info("成功");
            }
            //发送失败 执行onException
            @Override
            public void onException(Throwable e) {
                System.out.println("消息发送失败");
            }
        });
        log.info("方法调用结束");
        return "success";
        //TODO 4 asyncSend自行尝试找到发送延迟消息的重载方法
    }
}
